package message.preset;

import java.nio.BufferOverflowException;
import java.nio.ByteBuffer;
import java.nio.charset.Charset;

import message.AbstractMessageParser;
import message.reflect.HandlerMapper;

public class StringMessageParser extends AbstractMessageParser{

	public StringMessageParser(Object obj, HandlerMapper mapper) {
		super(obj);
		this.charset = mapper.getCharset();
	}
	
	private Charset charset;
	private int step = 0;
	private int i = 0;
	
//	private static Chain<ByteBuffer, StringMessageParser> chain = 
//		Chain.<ByteBuffer, StringMessageParser>of((buffer, x)->{
//			String str = (String)x.object;
//			try {
//				buffer.putInt(str.length());
//			} catch (BufferOverflowException e) {
//				return false;
//			}
//			return true;
//		}).next((buffer, x)->{
//			String str = (String)x.object;
//			while(x.i < str.length()){
//				try {
//					buffer.putChar(str.charAt(x.i));
//				} catch (BufferOverflowException e) {
//					return false;
//				}
//				x.i++;
//			}
//			return true;
//		});
	
	@Override
	public boolean write(ByteBuffer byteBuffer) {
		byte[] str = ((String)this.object).getBytes(charset);
		switch(step){
		case 0:
			try {
				byteBuffer.putInt(str.length);
			} catch (BufferOverflowException e) {
				return false;
			}
			step++;
		case 1:
			while(i < str.length) {
				try {
					byteBuffer.put(str[i]);
				} catch (BufferOverflowException e) {
					return false;
				}
				i++;
			}
			step++;
		}
		return true;
	}

}
